//
//  FunctionView.swift
//  swiftStudy
//
//  Created by ext.zhangjunfei on 2021/6/30.
//

import SwiftUI

struct FunctionView: View {
    
    let code_1:String
    let code_2:String
    let code_3:String
    let code_4:String
    let code_5:String
    
    init() {
        code_1 =
            """
            func sum(a:Int,b:Int)->Int{
                return a+b
            }

            var num = sum(a: 10, b: 20)
            print(num)
            """
        code_2 =
            """
            //返回多个值
            func sum_2(a:Int,b:Int)->(a:Int,b:Int,sum:Int){
              return (a,b,a+b)
            }

            var num_2 = sum_2(a: 10, b: 20)
            print("a=\\(num_2.a) b=\\(num_2.b) a+b=\\(num_2.sum)")
            """
        code_3 =
            """
            //可选参数
            func sum_3(a:Int = 10,b:Int=20){
                print(a+b)
            }

            sum_3(a:60)
            """
        code_4 =
            """
            //不定数量参数
            func sum_4(num:Int...)->Int{
                var sum = 0
                for i in num{
                    sum+=i
                }
                return sum
            }

            var num_4 = sum_4(num: 1,2,3,4,5,6,7,8,9,10)
            print(num_4)
            """
        code_5 =
            """
            func sum_5(a: inout Int,b:Int)->Int{
                a = 20
                return a+b
            }

            var a = 10
            print(sum_5(a:&a,b:60))

            //打印：80
            """
    }
    
    
    var body: some View {
        
        ScrollView(.vertical) {
            
            LazyVStack(alignment: .leading, spacing: 10) {
                Section(header: SectionHeaderView(title: "函数与闭包")) {
                    CommonTextView(content: "任何复杂的系统都是由许多简单的系统组合演化而来的，编程也是如此，复杂的功能都是由简单的功能组合而来的。函数是高级语言共有的代码特性，在编程中，函数的实质是完成特定功能的代码块。")
                    CommonTextView(content: "闭包的功能与函数类似，也是由一定功能的代码块，闭包与函数有着密不可分的关系：函数是有名称的功能代码块，闭包在大多数情况下是没有名称的功能代码块；")
                }
                
                Section(header: SectionHeaderView(title: "函数的基本应用")) {
                    CommonTextView(content: "在swift语言中，使用func关键字来声明函数：")
                    CodeView(code: code_1).padding(10)
                }
                
                Section(header: SectionHeaderView(title: "返回多个值")) {
                    CodeView(code: code_2).padding(10)
                }
                
                Section(header: SectionHeaderView(title: "可选参数")) {
                    CodeView(code: code_3).padding(10)
                }
                
                Section(header: SectionHeaderView(title: "不定数量参数")) {
                    CodeView(code: code_4).padding(10)
                }
                
                Section(header: SectionHeaderView(title: "inout参数类型")) {
                    CommonTextView(content: "Swift语言的参数传递，有这样一个特点，传递的如果是值类型的参数，那么参数值在传递的时候会在函数内部复制一份常量，且在函数内部不可修改。类属于引用数据类型，基本数据类型、枚举和结构体都属于值类型，对于值类型，如果要在函数内修改的话需要将此参数标记为inout类型")
                    CodeView(code: code_5).padding(10)
                }
            }
            
        }
    }
}

struct FunctionView_Previews: PreviewProvider {
    static var previews: some View {
        FunctionView()
    }
}
